package com.itany.shop.service.impl;

import com.itany.shop.dao.ProductDao;
import com.itany.shop.entity.Item;
import com.itany.shop.entity.Product;
import com.itany.shop.exception.ProductNotExistException;
import com.itany.shop.exception.UserNotLoginException;
import com.itany.shop.factory.ObjectFactory;
import com.itany.shop.service.CartService;
import com.itany.shop.vo.Cart;

import java.util.List;

/**
 * @Author:石小俊
 * @Date:2022/11/16 13:43
 * @Version:1.0-SNAPSHOT
 * @Description:
 */
public class CartServiceImpl implements CartService {

    private ProductDao productDao = (ProductDao) ObjectFactory.getObject("productDao");

    @Override
    public void addCart(Integer id, Cart cart) throws UserNotLoginException, ProductNotExistException {
        // 要求必须登录后才能加入购物车
        // 当用户登录之后,会获取到购物车对象
        // 如果用户未登录,则不存在购物车对象
        if(null == cart){
            throw new UserNotLoginException("请先登录");
        }
        // 由于商品的价钱可能会发生变化
        // 因此,此处模拟付款环节的查询当前价钱的操作
        // 查询当前商品的详情
        Product product = productDao.selectById(id);
        if(null == product){
            throw new ProductNotExistException("您输入的编号不对,请输入正确的商品编号");
        }

        // 加入购物车业务
        // 该业务可能存在两种情况
        // 1.加入购物车的商品在当前购物车中已经存在
        // 购物车发生怎么样的变化?
        List<Item> items = cart.getItems();
        for(Item item : items){
            // 如果加入购物车的商品的编号与当前购物车中某个商品的编号相同
            if(id.equals(item.getProduct().getId())){
                // 说明当前购物车中已经存在对应商品
                // 此时存在下列变化
                // 1.明细的数量=原来的明细数量+1
                item.setNum(item.getNum()+1);
                // 2.明细的总价=当前商品的单价*当前明细的数量
                // 当明细总价发生改变之前,获取的是原来的明细总价
                Double oldPrice = item.getPrice();
                item.setPrice(product.getPrice()*item.getNum());
                // 当明细总价发生改变之后,获取的是现在的明细总价
                Double newPrice = item.getPrice();
                // 3.购物车总价=原来的购物车总价-原来的明细总价+现在的明细总价
                cart.setPrice(cart.getPrice()-oldPrice+newPrice);
                return;
            }
        }

        // 2.加入购物车的商品在当前购物车中尚未存在
        // 购物车发生怎么样的变化?
        // 1.多了一个明细记录
        // 数量=1,明细总价=商品单价
        Item item = new Item();
        item.setNum(1);
        item.setProduct(product);
        item.setPrice(product.getPrice());
        cart.addItem(item);
        // 2.购物车总价=原来的购物车总价+当前商品的单价
        cart.setPrice(cart.getPrice()+product.getPrice());
    }

    @Override
    public void modifyNum(Integer id, Integer num, Cart cart) throws UserNotLoginException, ProductNotExistException {
        // 要求必须登录后才能加入购物车
        // 当用户登录之后,会获取到购物车对象
        // 如果用户未登录,则不存在购物车对象
        if(null == cart){
            throw new UserNotLoginException("请先登录");
        }
        // 由于商品的价钱可能会发生变化
        // 因此,此处模拟付款环节的查询当前价钱的操作
        // 查询当前商品的详情
        Product product = productDao.selectById(id);
        if(null == product){
            throw new ProductNotExistException("您输入的编号不对,请输入正确的商品编号");
        }
        // 找到需要修改的明细
        List<Item> items = cart.getItems();
        for(Item item : items) {
            if(id.equals(item.getProduct().getId())) {
                // 修改明细数量,购物车发生如下变化
                // 1.明细数量=num
                item.setNum(num);
                Double oldPrice = item.getPrice();
                // 2.明细总价=商品单价*num
                item.setPrice(product.getPrice()*num);
                Double newPrice = item.getPrice();
                // 3.购物车总价=原来的购物车总价-原来的明细总价+现在的明细总价
                cart.setPrice(cart.getPrice()-oldPrice+newPrice);
                return;
            }
        }
    }

    @Override
    public void removeCart(Integer id, Cart cart) throws UserNotLoginException, ProductNotExistException {
        // 要求必须登录后才能加入购物车
        // 当用户登录之后,会获取到购物车对象
        // 如果用户未登录,则不存在购物车对象
        if(null == cart){
            throw new UserNotLoginException("请先登录");
        }
        // 由于商品的价钱可能会发生变化
        // 因此,此处模拟付款环节的查询当前价钱的操作
        // 查询当前商品的详情
        Product product = productDao.selectById(id);
        if(null == product){
            throw new ProductNotExistException("您输入的编号不对,请输入正确的商品编号");
        }
        List<Item> items = cart.getItems();
        for(int i = 0; i < items.size(); i++){
            Item item = items.get(i);
            if(id.equals(item.getProduct().getId())){
                // 删除后购物车发生如下变化
                // 1.购物车总价=原来的购物车总价-被删除的明细总价
                cart.setPrice(cart.getPrice()-item.getPrice());
                // 2.移除对应的明细
                cart.removeItem(item);
            }
        }
    }
}
